package com.nebula.api;

import java.math.BigDecimal;

/**
 * @author Eastern unbeaten
 * @email chenshiyun2011@163.com
 * @date 2019-07-04 17:39
 */
public class BigDecimalUtil {
    public static final String PERCENTAGE = "%";

    /**
     * 显示精度
     */
    public static int DISP_SCALE = 2;

    /**
     * 计算过程中的精度
     */
    public static int STORE_SCALE = 4;

    /**
     * 计算过程中的精度
     */
    public static int CAL_SCALE = 8;

    /**
     * 0的精度
     */
    public static BigDecimal ZERO = new BigDecimal("0.00");

    /**
     * 100的精度
     */
    public static BigDecimal HUNDRED = new BigDecimal("100.00");

    /**
     * 用户授信额度
     */
    public static BigDecimal DEFAULT_BORROW_LIMIT = new BigDecimal("3000");

    /**
     * 绝对精确的乘法四舍五入保留两位小数点,任意0或者负数都不参数计算直接返回0.00
     *
     * @param a 乘数
     * @param b 被乘数
     * @return 返回商
     */
    public static BigDecimal multiplication(BigDecimal a, BigDecimal b) {
        if (isNullAndPositiveInteger(a, b)) {
            return ZERO;
        }
        return a.multiply(b).setScale(2, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 四舍五入除法
     *
     * @param a 除数
     * @param b 被除数
     * @return 返回商  不管你的除数被除数一个为零，直接返回0.00
     */
    public static BigDecimal division(BigDecimal a, BigDecimal b) {
        if (isNullAndPositiveInteger(a, b)) {
            return ZERO;
        }
        return a.divide(b, STORE_SCALE, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 判断参数是否为空
     *
     * @param parameters BigDecimal 类型只要==null && 非整数 && < 0 都返回 0.00
     * @return
     */
    public static boolean isNullAndPositiveInteger(BigDecimal... parameters) {
        if (parameters == null)
            return true;
        for (int i = 0; i < parameters.length; i++) {
            if (parameters[i] == null || parameters[i].compareTo(BigDecimal.ZERO) <= 0) {
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        // （（530557.38 - 492567.31） / 492567.31 ） *100
        BigDecimal multiplication = BigDecimalUtil.multiplication(
                BigDecimalUtil.division(
                        new BigDecimal("530557.38").subtract(new BigDecimal("492567.31"))
                        , new BigDecimal("492567.31")), BigDecimalUtil.HUNDRED);
        System.out.println(multiplication + PERCENTAGE);
    }
}
